package dsc;

import java.net.*;

/**
 * Deze klasse bevat methodes specifiek voor apparaten die direct aan de
 * server verbonden zijn. Dat zijn andere servers (hops) of
 * clients. Met de methodes kunnen de apparaatgegevens opgevraagd
 * of gemanipuleerd worden.
 *
 */
class ConnectedDevices {

    /* De next hop of de ipadress van de server. */
    private InetAddress ipadress;

    /* Poort van het device. */
    private int port;

    /* Als de server de parent is dan true anders false. */
    private boolean parent = false;
    /*
     * De naam van dit device indien het een server is.
     * Veld is leeg als het een connectie naar een direct verbonden client
     * is.
     */
    private String tag = "";
    /* De tijd waarop de laatste ping is gestuurd.*/
    private long ping = 0;
    /* De tijd waarop de laatste pong is ontvangen*/
    private long pong = 0;
    /* Houdt de niet ontvangen pong bij die verwacht worden.*/
    private int pingcount = 1;
    /* Houdt het nummer van de verstuurde berichten bij naar dit device*/
    private int volgnummer = 0;
    /* Houdt het nummer van de ontvangen berichten bij van dit device */
    private int receivedNumber = 0;
    /* De status van het device*/
    private boolean active = true;

    /**
     * De constructor van het Connected device.
     *
     * @param ipadress      Het ip-adress van dit device.
     * @param port          User name van de client
     */
    protected ConnectedDevices(InetAddress ipadress, int port) {
        this.ipadress = ipadress;
        this.port = port;
    }

    /**
     * Setter van het ip-adress veld.
     *
     * @param admin         Het nieuwe ipadress.
     *
     * @return
     */
    protected void setIpadress(InetAddress ipadress) {
        this.ipadress = ipadress;
    }

    /**
     * Getter van het ip-adress veld.
     *
     * @return          Het ipadress van de client.
     */
    protected InetAddress getIpadress() {
        return ipadress;
    }

    /**
     * Setter van het port veld.
     *
     * @param       De nieuwe port van de client.
     *
     * @return
     */
    protected void setPort(int port) {
        this.port = port;
    }

    /**
     * Getter van het ip-adress veld.
     *
     * @return          De port van de client.
     */
    protected int getPort() {
        return port;
    }

    /**
     * Setter van het parent veld.
     *
     * @param parent    Nieuwe waarde van het parent veld.
     */
    protected void setParent(boolean parent) {
        this.parent = parent;
    }

    /**
     * Getter van het parent veld.
     *
     * @return          Geeft true of false terug is dit de parent van deze
     *                  server?
     */
    protected boolean getParent() {
        return parent;
    }

    /**
     * Setter van het tag veld.
     *
     * @para tag        De nieuwe naam van het device.
     */

    protected void setTag(String tag) {
        this.tag = tag;
    }

    /**
     * Getter van het tag veld.
     *
     * @return          De naam van de server.
     */
    protected String getTag() {
        return tag;
    }

    /**
     * Setter van het ping veld.
     *
     * @param       De nieuwe tijd waarop de ping is verstuurd.
     *
     * @return
     */
    protected void setPing(long ping) {
        this.ping = ping;
    }

    /**
     * Getter van het ping veld.
     *
     * @return          De tijd waarop het laatst is gepingt.
     */
    protected long getPing() {
        return ping;
    }

    /**
     * Setter van het pong veld.
     *
     * @param       De nieuwe tijd waarop de pong is ontvangen.
     *
     * @return
     */
    protected void setPong(long pong) {
        this.pong = pong;
    }

    /**
     * Getter van het ping veld.
     *
     * @return          De tijd waarop voor het laatst een pong is ontvangen.
     */
    protected long getPong() {
        return pong;
    }

    /**
     * Setter van het pingCount veld.
     *
     * @param       De nieuwe pingcount.
     *
     * @return
     */
    protected void setPingcount(int pingcount) {
        this.pingcount = pingcount;
    }

    /**
     * Getter van het ping veld.
     *
     * @return          De huidige pingcount.
     */
    protected int getPingcount() {
        return pingcount;
    }

    /**
     * Getter van het volgnummer veld.
     *
     * @return          De huidige volgnummer.
     */
    protected int getVolgnummer() {
        return volgnummer;
    }

    /**
     * Verhoogt de waarde van de volnummer.
     *
     * @return          De huidige volgnummer+1.
     */
    protected int upVolgnummer() {
        return volgnummer++;
    }

    /**
     * Getter van het received number veld.
     *
     * @return          De nummer van het laatst ontvangen bericht.
     */
    protected int getReceivedNumber() {
        return receivedNumber;
    }

    /**
     * Setter van het receivednumber veld.
     *
     * @param       Het nieuwe nummer van het laatst ontvangen bericht.
     *
     * @return
     */
    protected void setReceivedNumber(int receivedNumber) {
        this.receivedNumber = receivedNumber;
    }

    /**
     * Check of device bij een server hoort.
     *
     *@return       true als dit object een server is,
     *              false als het een client is.
     */
    protected boolean isServer() {
        return !(tag.isEmpty());
    }
    
    /**
     * Setter van het status veld.
     *
     * @param       De nieuwe status van het device.
     *
     * @return
     */
    protected void setStatus(boolean status) {
        active = status;
    }

    /**
     * Getter van de status van dit device.
     *
     * @return       De status van het device.
     */
    protected boolean getStatus() {
        return active;
    }


}
